package org.javahispano.javacup.tacticas_aceptadas.dconrado;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.javahispano.javacup.modelo.*;

public class TacticaHorta implements Tactica {

	TacticaHortaDetalle detalle = new TacticaHortaDetalle();
	Posicion alineacion1[] = new Posicion[] {
			new Posicion(0.2595419847328244, -50.41044776119403),
			new Posicion(-11.16030534351145, -31.082089552238806),
			new Posicion(11.16030534351145, -31.6044776119403),
			new Posicion(27.251908396946565, -27.94776119402985),
			new Posicion(-29.84732824427481, -26.902985074626866),
			new Posicion(8.564885496183205, -7.574626865671642),
			new Posicion(-10.641221374045802, -7.052238805970149),
			new Posicion(27.251908396946565, 4.440298507462686),
			new Posicion(-29.32824427480916, 3.3955223880597014),
			new Posicion(-0.2595419847328244, 19.067164179104477),
			new Posicion(-0.2595419847328244, 30.78358208955224) };
	Posicion alineacion2[] = new Posicion[] {
			new Posicion(0.2595419847328244, -50.41044776119403),
			new Posicion(-11.16030534351145, -31.082089552238806),
			new Posicion(11.16030534351145, -31.6044776119403),
			new Posicion(28.290076335877863, -28.470149253731343),
			new Posicion(-28.290076335877863, -28.470149253731343),
			new Posicion(11.16030534351145, -1.3059701492537314),
			new Posicion(-10.641221374045802, -0.7835820895522387),
			new Posicion(-27.251908396946565, 31.6044776119403),
			new Posicion(-10.641221374045802, 30.559701492537314),
			new Posicion(9.603053435114505, 28.992537313432837),
			new Posicion(5.69465648854962, 28.992537313432837) };
	Posicion alineacion3[] = new Posicion[] {
			new Posicion(0.2595419847328244, -50.41044776119403),
			new Posicion(-11.16030534351145, -35.78358208955224),
			new Posicion(12.717557251908397, -35.26119402985075),
			new Posicion(28.290076335877863, -28.470149253731343),
			new Posicion(-28.290076335877863, -28.470149253731343),
			new Posicion(14.793893129770993, -18.544776119402986),
			new Posicion(-17.389312977099234, -19.58955223880597),
			new Posicion(-23.618320610687025, -0.7835820895522387),
			new Posicion(5.969465648854961, -5.485074626865671),
			new Posicion(0.2595419847328244, -0.26119402985074625),
			new Posicion(22.580152671755727, -1.3059701492537314) };
	Posicion alineacion4[] = new Posicion[] {
			new Posicion(0.2595419847328244, -50.41044776119403),
			new Posicion(-11.16030534351145, -35.78358208955224),
			new Posicion(12.717557251908397, -35.26119402985075),
			new Posicion(28.290076335877863, -28.470149253731343),
			new Posicion(-28.290076335877863, -28.470149253731343),
			new Posicion(14.793893129770993, -18.544776119402986),
			new Posicion(-17.389312977099234, -19.58955223880597),
			new Posicion(-23.618320610687025, -0.7835820895522387),
			new Posicion(6.4885496183206115, -6.529850746268657),
			new Posicion(-6.4885496183206115, -6.529850746268657),
			new Posicion(22.580152671755727, -1.3059701492537314) };

	private int onetime = 1;
	private int itera = 0;
	private int iteratmp = 0;
	private boolean saco = true;
	private boolean tiro30;

	private Posicion posold;
	private Posicion posnew;

	public TacticaDetalle getDetalle() {
		return detalle;
	}

	int cambia = 0;

	public Posicion[] getPosicionSaca(SituacionPartido sp) {
		return alineacion3;
	}

	public Posicion[] getPosicionRecive(SituacionPartido sp) {
		return alineacion4;
	}

	Random rand = new Random();
	LinkedList<Comando> comandos = new LinkedList<Comando>();

	boolean puedeRematar(int rematan[], int jugadorActivo) {
		boolean trobat = false;
		for (int i = 0; i < rematan.length && !trobat; i++) {
			if (rematan[i] == jugadorActivo)
				trobat = true;
		}

		return trobat;
	}

	public List<Comando> ejecutar(SituacionPartido sp) {
		comandos.clear();
		// System.out.println("itera");
		itera++;
		
		// posici�n balon
		if (onetime == 1) {
			posold = sp.balon();
			onetime = 0;
		} else {
			posnew = sp.balon();
			onetime = onetime + 1;
		}

		
		// Gridding
		Grid grid = new Grid(sp.balon());

		int[] rematan = new int[11];
		for (int j = 0; j < 11; j++) {
			double dist = sp.balon().distancia(sp.misJugadores()[j]);
			if (sp.alturaBalon() <= Constantes.ALTURA_CONTROL_BALON
					&& sp.balon().distancia(sp.misJugadores()[j]) <= Constantes.DISTANCIA_CONTROL_BALON)
				rematan[j] = j;
		}

		for (int i0 = 0; i0 < Grid.GRIDX; i0++) {
			for (int j0 = 0; j0 < Grid.GRIDY; j0++) {

				if ((((Grid.GRIDY * i0) + j0 == 0))) {// PORTERO
					if (posnew != null && posold != null) {
						double x1 = (posnew.getX() - posold.getX());
						double y1 = (posnew.getY() - posold.getY());
						double y2 = (x1
								* ((-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1) - (x1 * posold
								.getY()));
						y2 = y2 / y1;
						Posicion posPortero = new Posicion(y2,
								(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);

						if (posPortero.getX() >= Constantes.posteIzqArcoInf
								.getX() - 1
								&& posPortero.getX() < Constantes.posteDerArcoInf
										.getX() + 1) {

							// posPortero = posPortero.moverAngulo(posPortero
							// .angulo(sp.balon()), 0.1);
							comandos.add(new ComandoIrA(0, posPortero));

						}
						//if (sp.balon().getY() > -30) {
						//	posPortero = new Posicion(-2,
						//			(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
							// posPortero = posPortero.moverAngulo(posPortero
							// .angulo(sp.balon()), 0.1);
						//	comandos.add(new ComandoIrA(0, posPortero));
						//}
					}
				} else if (((((Grid.GRIDY * i0) + j0) == 19))
						|| ((((Grid.GRIDY * i0) + j0) == 110))) {// DELANTERO
					comandos.add(new ComandoIrA((Grid.GRIDY * i0) + j0, sp
							.balon()));

					boolean trobat = false;
					int[] posicion_balon = grid.position(sp);
					for (int iau2x = 0; iau2x < posicion_balon.length; iau2x++) {
						if (posicion_balon[iau2x] == ((Grid.GRIDY * i0) + j0))
							trobat = true;
					}

					if (trobat) {
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								sp.balon()));
					} else {
						GridPosition gp = grid.getGridPosition(i0, j0);
						Posicion tmp = new Posicion(
								((gp.getX1() + gp.getX2()) / 2),
								((gp.getY1() + gp.getY2()) / 2));
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								tmp));
					}				
				} else if (((((Grid.GRIDY * i0) + j0) > 0))
						&& ((((Grid.GRIDY * i0) + j0) < 11))) {

					boolean continuar = true;
					for (int j = 0; j < 11 && continuar != false; j++) {
						double dist = sp.balon().distancia(sp.rivales()[j]);
						if (sp.alturaBalon() <= Constantes.ALTURA_CONTROL_BALON + 1
								&& sp.balon().distancia(sp.rivales()[j]) <= Constantes.DISTANCIA_CONTROL_BALON + 1)
							continuar = false;
					}

					GridPosition gp = grid.getGridPosition(i0, j0);
					Posicion mejorPos;
					// boolean puede = puedeRematar(rematan,((Grid.GRIDY * i0) +
					// j0));
					// max = (a > b) ? a : b;

					if (continuar) {
						// Si mi equipo no puede rematar, comportamiento
						// defensivo
						mejorPos = mejorPosicionDentrodeMiGrid(sp
								.misJugadores()[((Grid.GRIDY * i0) + j0)], sp
								.balon(), gp, sp.rivales(),
								((Grid.GRIDY * i0) + j0));

						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								mejorPos));

					} else {
						// Si mi equipo puede rematar el balon, comportamiento
						// atacante
						mejorPos = mejorPosicionDentrodeMiGrid2(sp
								.misJugadores()[((Grid.GRIDY * i0) + j0)], gp,
								sp.rivales(), ((Grid.GRIDY * i0) + j0));
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								mejorPos));

						// El bal�n esta en mi grid
						// El bal�n NO esta en mi grid
					}

				}

				// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
				// si estoy m�s cerca que los rivales trobat = true
				// para salirse del grid???
				int indMasCercano = sp.balon().indiceMasCercano(
						sp.misJugadores());

				int indMasCercanoRivales = sp.balon().indiceMasCercano(
						sp.rivales());

				Posicion posicionMia = new Posicion(
						sp.misJugadores()[indMasCercano].getX(), sp
								.misJugadores()[indMasCercano].getY());
				Posicion posicionRival = new Posicion(
						sp.rivales()[indMasCercanoRivales].getX(),
						sp.rivales()[indMasCercanoRivales].getY());

				Posicion posicionComparar[] = new Posicion[2];
				posicionComparar[0] = posicionMia;
				posicionComparar[1] = posicionRival;

				if ((indMasCercano == ((Grid.GRIDY * i0) + j0))) {
					comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0), sp
							.balon()));
				}
				// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx

				// Golpear balon

				tiro30 = false;
				for (int i : rematan) {

				/*	if (sp.saco()) {// XXX
						Posicion centro = new Posicion(0, 0);
						sp.misJugadores()[i] = sp.misJugadores()[i]
								.moverAngulo(sp.misJugadores()[i]
										.angulo(centro), 0.1);
						comandos.add(new ComandoIrA(i, sp.misJugadores()[i]));
					}*/

					// obtiene los jugadores mas cercanos, al jugador que puede
					// rematar
					int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp
							.misJugadores());
					// encontro un pase en falso
					boolean pase = false;
					boolean alto;
					boolean rival = false;
					// recorre los jugadores desde el mas lejano al mas cercano
					for (int j = 1; !pase && j < cercanos.length; j++) {
						// si el jugador es distinto al jugador que remata y el
						// jugador
						// esta mas adelantado
						if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]]
								.getY() - 6) {
							// dar pase al jugador mas cercano que este en
							// posicion mas
							// ofensiva
							if (sp.misJugadores()[i].distancia(sp
									.misJugadores()[cercanos[j]]) > 20) {
								alto = true;
							} else {
								alto = false;
							}

							Posicion[] cercanosRivales = sp.rivales();
							for (int irival = 0; irival < cercanosRivales.length; irival++) {
								// Ecuaci�n recta
								double y = (sp.misJugadores()[cercanos[j]]
										.getY() - sp.misJugadores()[i].getY())
										/ (sp.misJugadores()[cercanos[j]]
												.getX() - sp.misJugadores()[i]
												.getX());
								if (cercanosRivales[irival].getY() == (y * cercanosRivales[irival]
										.getX())
										- (y * sp.misJugadores()[i].getX())
										+ sp.misJugadores()[i].getY())
									rival = true;

								if (sp.balon().getY() < -20) {
									double x1 = sp.misJugadores()[cercanos[j]]
											.getX()
											- cercanosRivales[irival].getX();
									double y1 = sp.misJugadores()[cercanos[j]]
											.getY()
											- cercanosRivales[irival].getX();

									if ((x1 > -3 && x1 < 3)
											|| (y1 > -3 && y1 < 3)) // Si
										// esta
										// demasiado
										// cerca
										// el
										// rival
										rival = true;

								}
							}

							if (!rival) {// no hay oponente entre mi pase y el
								// destino

								comandos.add(new ComandoGolpearBalon(i, sp
										.misJugadores()[cercanos[j]], .5 + rand
										.nextDouble() * .5, alto));
								// encontro un pase por lo menos
								pase = true;
							}

							/*
							 * comandos.add(new ComandoGolpearBalon(i, sp
							 * .misJugadores()[cercanos[j]], .5 + rand
							 * .nextDouble() .5, alto)); // encontro un pase por
							 * lo menos pase = true;
							 */
						}

						// if(rival)
						// System.out.println("break2");
					}

					// si no encontro ningun pase
					if (!pase) {

						// da pase hacia el jugador mas cercano
						if (sp.misJugadores()[i]
								.distancia(sp.misJugadores()[cercanos[1]]) > 20) {
							alto = true;
						} else {
							alto = false;
						}

						if (sp.balon().getY() < -30) {
							comandos
									.add(new ComandoGolpearBalon(
											i,
											sp.misJugadores()[cercanos[cercanos.length - 1]],
											1, true));
						} else {
							// XXX quitar rand, calcularlo ?
							comandos.add(new ComandoGolpearBalon(i, sp
									.misJugadores()[cercanos[1]], .5 + rand
									.nextDouble() * .5, alto));
						}

					}

					// si el jugador que remata esta a menos de 30 metros del
					// arco rival
					// -> remata al arco

					if (sp.misJugadores()[i]
							.distancia(Constantes.centroArcoSup) < 30) {
						tiro30 = true;
						// XXX AMPLIAR PARA PORTERO Y DEMAS RIVALES
						double distmax = 0;
						double xportero = sp.rivales()[0].getX();
						for (int pos_porteria = (int) Constantes.centroArcoSup.getX() - 2; pos_porteria < Constantes.centroArcoSup
								.getX() + 2; pos_porteria++) {
							int posi = pos_porteria - (int) xportero;
							if (posi < 0) {
								if ((-posi) > -distmax)
									distmax = pos_porteria;
							} else {
								if (((posi) > distmax) && ((posi) > -distmax))
									distmax = pos_porteria;
							}
						}
						// System.out.println("distmax"+distmax);
						// comandos.add(new ComandoGolpearBalon(i, new Posicion(
						// distmax, Constantes.LARGO_CAMPO_JUEGO / 2), 1,
						// 20));
						//Random r = new Random();
						//double f = r.nextDouble() * 0.2 + 0.8;

						//comandos.add(new ComandoGolpearBalon(i,
						//		Constantes.centroArcoSup, f, true));
						comandos.add(new ComandoGolpearBalon(i, new Posicion(distmax,
								Constantes.LARGO_CAMPO_JUEGO / 2), 1, true));
					}

					// si no hay nadie cerca y estoy en mi grid avanzo

					if (!sp.saco() && i != 0 && i < 12 && tiro30 == false) {
						boolean continuar = true;

						/*
						 * int puedenrematarRivales[] = sp.puedenRematarRival();
						 * if(puedenrematarRivales.length==0) continuar=true;
						 * else continuar=false;
						 */
						/*
						 * int
						 * puedenrematarRivales[]=sp.iteracionesParaRematarRival
						 * (); for (int
						 * j=0;j<puedenrematarRivales.length&&continuar
						 * !=false;j++) { if ((puedenrematarRivales[j] == 1)) {
						 * continuar = false; } else { continuar = true; } }
						 */
						for (int j = 0; j < 11 && continuar != false; j++) {
							double dist = sp.balon().distancia(sp.rivales()[j]);
							if (sp.alturaBalon() <= Constantes.ALTURA_CONTROL_BALON + 1
									&& sp.balon().distancia(sp.rivales()[j]) <= Constantes.DISTANCIA_CONTROL_BALON + 1)
								continuar = false;
						}

						 if (sp.balon().getY() < 5)
						 continuar = false;

						if (continuar) {
							Posicion centro = new Posicion(0,
									Constantes.LARGO_CAMPO_JUEGO / 2);
							// System.out.print("jugador" + i +
							// "pase adelante sp.misJugadores()[i]"
							// +sp.misJugadores()[i]);
							sp.misJugadores()[i] = sp.misJugadores()[i]
									.moverAngulo(sp.misJugadores()[i]
											.angulo(centro), 0.1);
							// System.out.println(
							// "siguiente adelante sp.misJugadores()[i]"
							// +sp.misJugadores()[i]);
							if (((Grid.GRIDY * i0) + j0) < 11)
								comandos.add(new ComandoIrA(
										((Grid.GRIDY * i0) + j0), sp
												.misJugadores()[i]));

							if (sp.misJugadores()[i]
									.distancia(Constantes.centroArcoSup) < 30) {
								/*Random r = new Random();
								double f = r.nextDouble() * 0.2 + 0.8;

								comandos.add(new ComandoGolpearBalon(i,
										Constantes.centroArcoSup, f, 1));*/
								
								// XXX AMPLIAR PARA PORTERO Y DEMAS
								double distmax = 0;
								double xportero = sp.rivales()[0].getX();
								for (int pos_porteria = (int) Constantes.centroArcoSup.getX() - 2; pos_porteria < Constantes.centroArcoSup
										.getX() + 2; pos_porteria++) {
									int posi = pos_porteria - (int) xportero;
									if (posi < 0) {
										if ((-posi) > -distmax)
											distmax = pos_porteria;
									} else {
										if (((posi) > distmax) && ((posi) > -distmax))
											distmax = pos_porteria;
									}
								}
								// System.out.println("distmax"+distmax);
								comandos.add(new ComandoGolpearBalon(i, new Posicion(distmax,
										Constantes.LARGO_CAMPO_JUEGO / 2), 1, true));

							} else
								comandos.add(new ComandoGolpearBalon(i));
						} else {
							int incremento = 0;
							 if(sp.balon().getX()>0)
							incremento = -25;
							 else
							 incremento =+25;
							Posicion centro = new Posicion(0 + incremento,
									Constantes.LARGO_CAMPO_JUEGO / 2);
							sp.misJugadores()[i] = sp.misJugadores()[i]
									.moverAngulo(sp.misJugadores()[i]
											.angulo(centro), 0.1);
							if (((Grid.GRIDY * i0) + j0) < 11)
								comandos.add(new ComandoIrA(
										((Grid.GRIDY * i0) + j0), sp
												.misJugadores()[i]));

							if (sp.misJugadores()[i]
									.distancia(Constantes.centroArcoSup) < 30) {
								/*Random r = new Random();
								double f = r.nextDouble() * 0.2 + 0.8;

								comandos.add(new ComandoGolpearBalon(i,
										Constantes.centroArcoSup, f, 1));*/
								
								// XXX AMPLIAR PARA PORTERO Y DEMAS
								double distmax = 0;
								double xportero = sp.rivales()[0].getX();
								for (int pos_porteria = (int) Constantes.centroArcoSup.getX() - 2; pos_porteria < Constantes.centroArcoSup
										.getX() + 2; pos_porteria++) {
									int posi = pos_porteria - (int) xportero;
									if (posi < 0) {
										if ((-posi) > -distmax)
											distmax = pos_porteria;
									} else {
										if (((posi) > distmax) && ((posi) > -distmax))
											distmax = pos_porteria;
									}
								}
								// System.out.println("distmax"+distmax);
								comandos.add(new ComandoGolpearBalon(i, new Posicion(distmax,
										Constantes.LARGO_CAMPO_JUEGO / 2), 1, true));
							} else
								comandos.add(new ComandoGolpearBalon(i, centro,
										1, 1));

						}
					}

					if (sp.saco() && i != 0 && i < 12) {// XXX
						Posicion centro = new Posicion(0, 0);
						sp.misJugadores()[i] = sp.misJugadores()[i]
								.moverAngulo(sp.misJugadores()[i]
										.angulo(centro), 0.1);
						comandos.add(new ComandoGolpearBalon(i, centro, 1, 1));
					}

				}

			}

		}
		return comandos;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.javahispano.javacup.modelo.Tactica#ejecutar(org.javahispano.javacup
	 * .modelo.SituacionPartido)
	 */

	public List<Comando> ejecutarlast(SituacionPartido sp) {
		comandos.clear();
		// System.out.println("itera");
		itera++;
		// posici�n balon
		if (onetime == 1) {
			posold = sp.balon();
			onetime = 0;
		} else {
			posnew = sp.balon();
			onetime = onetime + 1;
		}

		// Gridding
		Grid grid = new Grid(sp.balon());

		int rematan[] = sp.puedenRematar();

		for (int i0 = 0; i0 < Grid.GRIDX; i0++) {
			for (int j0 = 0; j0 < Grid.GRIDY; j0++) {

				if ((((Grid.GRIDY * i0) + j0 == 0))) {// PORTERO

					if (posnew != null && posold != null) {
						double x1 = (posnew.getX() - posold.getX());
						double y1 = (posnew.getY() - posold.getY());
						double y2 = (x1
								* ((-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1) - (x1 * posold
								.getY()));
						y2 = y2 / y1;
						Posicion posPortero = new Posicion(y2,
								(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);

						if (posPortero.getX() >= Constantes.posteIzqArcoInf
								.getX() - 1
								&& posPortero.getX() < Constantes.posteDerArcoInf
										.getX() + 1) {

							// posPortero = posPortero.moverAngulo(posPortero
							// .angulo(sp.balon()), 0.1);
							comandos.add(new ComandoIrA(0, posPortero));

						}
						if (sp.balon().getY() > -30) {
							posPortero = new Posicion(-2,
									(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
							// posPortero = posPortero.moverAngulo(posPortero
							// .angulo(sp.balon()), 0.1);
							comandos.add(new ComandoIrA(0, posPortero));
						}
					}
				} else if (((((Grid.GRIDY * i0) + j0) == 9))
						|| ((((Grid.GRIDY * i0) + j0) == 10))) {// DELANTERO
					comandos.add(new ComandoIrA((Grid.GRIDY * i0) + j0, sp
							.balon()));

					boolean trobat = false;
					int[] posicion_balon = grid.position(sp);
					for (int iau2x = 0; iau2x < posicion_balon.length; iau2x++) {
						if (posicion_balon[iau2x] == ((Grid.GRIDY * i0) + j0))
							trobat = true;
					}

					if (trobat) {
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								sp.balon()));
					} else {
						GridPosition gp = grid.getGridPosition(i0, j0);
						Posicion tmp = new Posicion(
								((gp.getX1() + gp.getX2()) / 2),
								((gp.getY1() + gp.getY2()) / 2));
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								tmp));
					}

				} else if (((((Grid.GRIDY * i0) + j0) > 0))
						&& ((((Grid.GRIDY * i0) + j0) < 9))) {

					GridPosition gp = grid.getGridPosition(i0, j0);
					Posicion mejorPos;
					// boolean puede = puedeRematar(rematan,((Grid.GRIDY * i0) +
					// j0));
					// max = (a > b) ? a : b;
					boolean puede = (rematan.length == 0) ? false : true;
					if (!puede) {
						// Si mi equipo no puede rematar, comportamiento
						// defensivo
						mejorPos = mejorPosicionDentrodeMiGrid(sp
								.misJugadores()[((Grid.GRIDY * i0) + j0)], sp
								.balon(), gp, sp.rivales(),
								((Grid.GRIDY * i0) + j0));

						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								mejorPos));

					} else {
						// Si mi equipo puede rematar el balon, comportamiento
						// atacante
						mejorPos = mejorPosicionDentrodeMiGrid2(sp
								.misJugadores()[((Grid.GRIDY * i0) + j0)], gp,
								sp.rivales(), ((Grid.GRIDY * i0) + j0));
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								mejorPos));

						// El bal�n esta en mi grid
						// El bal�n NO esta en mi grid
					}

				}

				// si estoy m�s cerca que los rivales trobat = true
				int indMasCercano = sp.balon().indiceMasCercano(
						sp.misJugadores());

				int indMasCercanoRivales = sp.balon().indiceMasCercano(
						sp.rivales());

				Posicion posicionMia = new Posicion(
						sp.misJugadores()[indMasCercano].getX(), sp
								.misJugadores()[indMasCercano].getY());
				Posicion posicionRival = new Posicion(
						sp.rivales()[indMasCercanoRivales].getX(),
						sp.rivales()[indMasCercanoRivales].getY());

				Posicion posicionComparar[] = new Posicion[2];
				posicionComparar[0] = posicionMia;
				posicionComparar[1] = posicionRival;

				if ((indMasCercano == ((Grid.GRIDY * i0) + j0))) {
					comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0), sp
							.balon()));
				}

				if (sp.saco() && 3 == 2) {

					if (((((Grid.GRIDY * i0) + j0) > -1))
							&& ((((Grid.GRIDY * i0) + j0) < 11))) {
						if ((sp.misJugadores()[((Grid.GRIDY * i0) + j0)].getX() >= Constantes.ANCHO_CAMPO_JUEGO / 2)
								|| (sp.misJugadores()[((Grid.GRIDY * i0) + j0)]
										.getX() <= -Constantes.ANCHO_CAMPO_JUEGO / 2)
								|| (sp.misJugadores()[((Grid.GRIDY * i0) + j0)]
										.getY() >= Constantes.LARGO_CAMPO_JUEGO / 2)
								|| (sp.misJugadores()[((Grid.GRIDY * i0) + j0)]
										.getY() <= -Constantes.LARGO_CAMPO_JUEGO / 2)) {
							System.out
									.println("X"
											+ (sp.misJugadores()[((Grid.GRIDY * i0) + j0)]
													.getX()
													+ ":Y:" + (sp
													.misJugadores()[((Grid.GRIDY * i0) + j0)]
													.getY())));

							double x1 = (0 - sp.balon().getX());
							double y1 = (0 - sp.balon().getY());
							double y2 = (x1 * 0 - (x1 * sp.balon().getY()));
							y2 = y2 / y1;
							Posicion n = new Posicion(y2,
									sp.misJugadores()[((Grid.GRIDY * i0) + j0)]
											.getY());

							// posPortero = posPortero.moverAngulo(posPortero
							// .angulo(sp.balon()), 0.1);
							// comandos.add(new ComandoIrA(0, posPortero));

							Posicion n2 = sp.misJugadores()[((Grid.GRIDY * i0) + j0)];
							Posicion centro = new Posicion(0, 0);
							n2 = n2.moverAngulo(n2.angulo(centro), 0.0001);
							comandos.add(new ComandoIrA(
									((Grid.GRIDY * i0) + j0), n2));
						}
					}

				}

				// Golpear balon

				tiro30 = false;
				for (int i : rematan) {

					if (sp.saco()) {// XXX
						Posicion centro = new Posicion(0, 0);
						sp.misJugadores()[i] = sp.misJugadores()[i]
								.moverAngulo(sp.misJugadores()[i]
										.angulo(centro), 0.1);
						comandos.add(new ComandoIrA(i, sp.misJugadores()[i]));
					}

					// obtiene los jugadores mas cercanos, al jugador que puede
					// rematar
					int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp
							.misJugadores());
					// encontro un pase en falso
					boolean pase = false;
					boolean alto;
					boolean rival = false;
					// recorre los jugadores desde el mas lejano al mas cercano
					for (int j = 1; !pase && j < cercanos.length; j++) {
						// si el jugador es distinto al jugador que remata y el
						// jugador
						// esta mas adelantado
						if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]]
								.getY() - 6) {
							// dar pase al jugador mas cercano que este en
							// posicion mas
							// ofensiva
							if (sp.misJugadores()[i].distancia(sp
									.misJugadores()[cercanos[j]]) > 20) {
								alto = true;
							} else {
								alto = false;
							}

							Posicion[] cercanosRivales = sp.rivales();
							for (int irival = 0; irival < cercanosRivales.length; irival++) {
								// Ecuaci�n recta
								double y = (sp.misJugadores()[cercanos[j]]
										.getY() - sp.misJugadores()[i].getY())
										/ (sp.misJugadores()[cercanos[j]]
												.getX() - sp.misJugadores()[i]
												.getX());
								if (cercanosRivales[irival].getY() == (y * cercanosRivales[irival]
										.getX())
										- (y * sp.misJugadores()[i].getX())
										+ sp.misJugadores()[i].getY())
									rival = true;

								if (sp.balon().getY() < -20) {
									double x1 = sp.misJugadores()[cercanos[j]]
											.getX()
											- cercanosRivales[irival].getX();
									double y1 = sp.misJugadores()[cercanos[j]]
											.getY()
											- cercanosRivales[irival].getX();

									if ((x1 > -3 && x1 < 3)
											|| (y1 > -3 && y1 < 3)) // Si
										// esta
										// demasiado
										// cerca
										// el
										// rival
										rival = true;

								}
							}

							if (!rival) {// no hay oponente entre mi pase y el
								// destino

								comandos.add(new ComandoGolpearBalon(i, sp
										.misJugadores()[cercanos[j]], .5 + rand
										.nextDouble() * .5, alto));
								// encontro un pase por lo menos
								pase = true;
							}

							/*
							 * comandos.add(new ComandoGolpearBalon(i, sp
							 * .misJugadores()[cercanos[j]], .5 + rand
							 * .nextDouble() .5, alto)); // encontro un pase por
							 * lo menos pase = true;
							 */
						}

						// if(rival)
						// System.out.println("break2");
					}

					// si no encontro ningun pase
					if (!pase) {

						// da pase hacia el jugador mas cercano
						if (sp.misJugadores()[i]
								.distancia(sp.misJugadores()[cercanos[1]]) > 20) {
							alto = true;
						} else {
							alto = false;
						}

						if (sp.balon().getY() < -30) {
							comandos
									.add(new ComandoGolpearBalon(
											i,
											sp.misJugadores()[cercanos[cercanos.length - 1]],
											1, true));
						} else {
							// XXX quitar rand, calcularlo ?
							comandos.add(new ComandoGolpearBalon(i, sp
									.misJugadores()[cercanos[1]], .5 + rand
									.nextDouble() * .5, alto));
						}

					}

					// si el jugador que remata esta a menos de 30 metros del
					// arco rival
					// -> remata al arco

					if (sp.misJugadores()[i]
							.distancia(Constantes.centroArcoSup) < 30) {
						tiro30 = true;
						// XXX AMPLIAR PARA PORTERO Y DEMAS RIVALES
						double distmax = 0;
						double xportero = sp.rivales()[0].getX();
						for (int pos_porteria = (int) Constantes.posteDerArcoInf
								.getX(); pos_porteria < Constantes.posteDerArcoSup
								.getX(); pos_porteria++) {
							int posi = pos_porteria - (int) xportero;
							if (posi < 0) {
								if ((-posi) > -distmax)
									distmax = pos_porteria;
							} else {
								if (((posi) > distmax) && ((posi) > -distmax))
									distmax = pos_porteria;
							}
						}
						// System.out.println("distmax"+distmax);
						// comandos.add(new ComandoGolpearBalon(i, new Posicion(
						// distmax, Constantes.LARGO_CAMPO_JUEGO / 2), 1,
						// 20));
						Random r = new Random();
						double f = r.nextDouble() * 0.2 + 0.8;

						comandos.add(new ComandoGolpearBalon(i,
								Constantes.centroArcoSup, f, true));
					}

					// si no hay nadie cerca y estoy en mi grid avanzo

					if (!sp.saco() && i != 0 && i < 12 && tiro30 == false) {
						boolean continuar = true;

						/*
						 * int puedenrematarRivales[] = sp.puedenRematarRival();
						 * if(puedenrematarRivales.length==0) continuar=true;
						 * else continuar=false;
						 */
						/*
						 * int
						 * puedenrematarRivales[]=sp.iteracionesParaRematarRival
						 * (); for (int
						 * j=0;j<puedenrematarRivales.length&&continuar
						 * !=false;j++) { if ((puedenrematarRivales[j] == 1)) {
						 * continuar = false; } else { continuar = true; } }
						 */
						for (int j = 0; j < 11 && continuar != false; j++) {
							double dist = sp.balon().distancia(sp.rivales()[j]);
							if (sp.alturaBalon() <= Constantes.ALTURA_CONTROL_BALON + 1
									&& sp.balon().distancia(sp.rivales()[j]) <= Constantes.DISTANCIA_CONTROL_BALON + 3)
								continuar = false;
						}

						if (sp.balon().getY() < 15)
							continuar = false;

						if (continuar) {
							Posicion centro = new Posicion(0,
									Constantes.LARGO_CAMPO_JUEGO / 2);
							// System.out.print("jugador" + i +
							// "pase adelante sp.misJugadores()[i]"
							// +sp.misJugadores()[i]);
							sp.misJugadores()[i] = sp.misJugadores()[i]
									.moverAngulo(sp.misJugadores()[i]
											.angulo(centro), 0.1);
							// System.out.println(
							// "siguiente adelante sp.misJugadores()[i]"
							// +sp.misJugadores()[i]);
							if (((Grid.GRIDY * i0) + j0) < 11)
								comandos.add(new ComandoIrA(
										((Grid.GRIDY * i0) + j0), sp
												.misJugadores()[i]));

							if (sp.misJugadores()[i]
									.distancia(Constantes.centroArcoSup) < 30) {
								Random r = new Random();
								double f = r.nextDouble() * 0.2 + 0.8;

								comandos.add(new ComandoGolpearBalon(i,
										Constantes.centroArcoSup, f, 1));

							} else
								comandos.add(new ComandoGolpearBalon(i));
						} else {
							int incremento = 0;
							// if(sp.balon().getX()>0)
							incremento = +25;
							// else
							// incremento = -25;
							Posicion centro = new Posicion(0 + incremento,
									Constantes.LARGO_CAMPO_JUEGO / 2);
							sp.misJugadores()[i] = sp.misJugadores()[i]
									.moverAngulo(sp.misJugadores()[i]
											.angulo(centro), 0.1);
							if (((Grid.GRIDY * i0) + j0) < 11)
								comandos.add(new ComandoIrA(
										((Grid.GRIDY * i0) + j0), sp
												.misJugadores()[i]));

							if (sp.misJugadores()[i]
									.distancia(Constantes.centroArcoSup) < 30) {
								Random r = new Random();
								double f = r.nextDouble() * 0.2 + 0.8;

								comandos.add(new ComandoGolpearBalon(i,
										Constantes.centroArcoSup, f, 1));

							} else
								comandos.add(new ComandoGolpearBalon(i, centro,
										1, 1));

						}
					}

					if (sp.saco() && i != 0 && i < 12) {// XXX
						Posicion centro = new Posicion(0, 0);
						sp.misJugadores()[i] = sp.misJugadores()[i]
								.moverAngulo(sp.misJugadores()[i]
										.angulo(centro), 0.1);
						comandos.add(new ComandoGolpearBalon(i, centro, 1, 1));
					}

				}

				/*
				 * if (((((Grid.GRIDY i0) + j0) > -1)) && ((((Grid.GRIDY i0) +
				 * j0) < 11))) { if(sp.saco()){ Posicion n2 =
				 * sp.misJugadores()[((Grid.GRIDY i0) + j0)]; Posicion centro =
				 * new Posicion(0, 0); n2 = n2.moverAngulo(n2.angulo(centro),
				 * 0.0001); comandos.add(new ComandoIrA(((Grid.GRIDY i0) + j0),
				 * n2)); }}
				 */

			}
		}

		return comandos;
	
	}
	
	public List<Comando> ejecutar0(SituacionPartido sp) {
		// vacia la lista de comandos
		comandos.clear();
		itera++;
		if (onetime == 1) {
			posold = sp.balon();
			onetime = 0;
		} else {
			posnew = sp.balon();
			onetime = onetime + 1;
		}

		Grid grid = new Grid(sp.balon());

		// for (int i = 0; i < 11; i++) {

		// if(i==3)
		// System.exit(-1);

		for (int i0 = 0; i0 < Grid.GRIDX; i0++) {
			for (int j0 = 0; j0 < Grid.GRIDY; j0++) {

				if ((Grid.GRIDY * i0) + j0 == 0) {// Si portero

				} else {
					GridPosition gp = grid.getGridPosition(i0, j0);
					// System.out.println("i0:"+i0+":j0:"+j0);

					// double x = ((gp.getX1() + gp.getX2()) / 2);
					// double y = ((gp.getY1() + gp.getY2()) / 2);
					// System.out.println("i0+j0:" + ((Grid.GRIDY * i0) + j0) +
					// ":x:"
					// + ((gp.getX1() + gp.getX2()) / 2) + ":y:"
					// + ((gp.getY1() + gp.getY2()) / 2));
					if ((Grid.GRIDY * i0) + j0 < 11) {
						// System.out.println(
						// "sp.misJugadores()[(Grid.GRIDY*i0)+j0].getX():"
						// +sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getX()+
						// "sp.misJugadores()[(Grid.GRIDY*i0)+j0].getY()"
						// +sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getY());
						// double = x -
						// sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getX();
						// /double ya = y -
						// sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getY();
						// System.out.println("i0+j0:"+((Grid.GRIDY*i0)+j0)+
						// ":xa+x:"+
						// (xa+sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getX())+
						// ":ya+y:"
						//+(ya+sp.misJugadores()[((Grid.GRIDY*i0)+j0)].getY()));
						// System.out.println("x:"+x+":xa:"+xa);
						// comandos.add(new ComandoIrA((Grid.GRIDY*i0)+j0, new
						// Posicion(xa+x,ya+y)));
						// System.out.println("i" + (Grid.GRIDY * i0 + j0) +
						// ":x:" + x
						// + ":y:" + y);
						// System.out.println("(gp.getX1()" + gp.getX1()
						// + ":gp.getX2():" + gp.getX2() + ":resul:"
						// + (gp.getX1() + gp.getX2()) / 2);
						// System.out.println("(gp.getY1()" + gp.getY1()
						// + ":gp.getY2():" + gp.getY2() + ":resul:"
						// + (gp.getY1() + gp.getY2()) / 2);
						/*
						 * comandos.add(new ComandoIrA(((Grid.GRIDY i0) + j0),
						 * new Posicion(x, y)));
						 */
					}
				}
				// System.exit(-1);
			}
		}

		// Desmarque
		// Si no tengo el balon

		for (int i0 = 0; i0 < Grid.GRIDX; i0++) {
			for (int j0 = 0; j0 < Grid.GRIDY; j0++) {
				// TACTICA PORTERO A MEJORAR ???
				if ((((Grid.GRIDY * i0) + j0 == 0))) {// ||((Grid.GRIDY * i0) +
					// j0 == 1)) {// Si
					// portero
					// System.out.println("balon X"+sp.balon().getX()
					// "poste izq inf");
					/*
					 * if ((sp.balon().getX() > -5) && (sp.balon().getX() < 5))
					 * { Posicion posPortero = new Posicion(sp.balon().getX(),
					 * -Constantes.LARGO_CAMPO_JUEGO / 2 + 5); comandos.add(new
					 * ComandoIrA(0, posPortero)); }
					 */
					/*
					 * if (sp.balon().getY() < -40) { Posicion
					 * posicionComparar[] = new Posicion[2]; posicionComparar[0]
					 * = sp.misJugadores()[(Grid.GRIDY i0) + j0];
					 * posicionComparar[1] = posicionRival; // si es m�s rapido
					 * y esta m�s cerca seguro que llega al // balon antes
					 * 
					 * if ((sp.balon().indiceMasCercano(posicionComparar) == 1)
					 * && (sp.detalleJugadoresRivales()[indMasCercanoRivales]
					 * .getVelocidad() > sp .detalleMisJugadores()[0]
					 * .getVelocidad())) { comandos.add(new ComandoIrA(0,
					 * Posicion.media(sp .balon(), posicionRival))); // si //
					 * estoy // m�s // cerca // y soy // m�s // r�pido } else if
					 * ((sp.balon().indiceMasCercano( posicionComparar) == 0) &&
					 * (sp.detalleJugadoresRivales()[indMasCercanoRivales]
					 * .getVelocidad() < sp .detalleMisJugadores()[0]
					 * .getVelocidad())) { // el jugador mas // cercano sigue al
					 * // balon comandos.add(new ComandoIrA(0, sp.balon())); } }
					 */
					// System.exit(-1);
					if (posnew != null && posold != null) {
						double x1 = (posnew.getX() - posold.getX());
						double y1 = (posnew.getY() - posold.getY());
						double y2 = (x1
								* ((-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1) - (x1 * posold
								.getY()));
						y2 = y2 / y1;
						Posicion posPortero = new Posicion(y2,
								(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
						// System.out.println("posPortero"+posPortero.getX());

						if (posPortero.getX() >= Constantes.posteIzqArcoInf
								.getX() - 1
								&& posPortero.getX() < Constantes.posteDerArcoInf
										.getX() + 1) {

							// if ((posPortero.getX() <= 0)
							// && posPortero.getX() >=
							// Constantes.posteIzqArcoInf
							// .getX()-1 && ((Grid.GRIDY * i0) + j0 == 0)){

							posPortero = posPortero.moverAngulo(posPortero
									.angulo(sp.balon()), 0.1);
							comandos.add(new ComandoIrA(0, posPortero));

							// } else if ((posPortero.getX() > 0)
							// && posPortero.getX() < Constantes.posteDerArcoInf
							// .getX()+1 && ((Grid.GRIDY * i0) + j0 == 1)){

							// posPortero =
							// posPortero.moverAngulo(posPortero.angulo
							// (sp.balon()),0.1);
							// comandos.add(new ComandoIrA(1, posPortero));
							// }
						}
						if (sp.balon().getY() > -10) {
							posPortero = new Posicion(-2,
									(-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
							posPortero = posPortero.moverAngulo(posPortero
									.angulo(sp.balon()), 0.1);
							comandos.add(new ComandoIrA(0, posPortero));
							// posPortero = new Posicion(
							// 2,
							// (-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
							// posPortero =
							// posPortero.moverAngulo(posPortero.angulo
							// (sp.balon()),0.1);
							// comandos.add(new ComandoIrA(1, posPortero));
						}
					}
					/*
					 * if ((posPortero.getX() < Constantes.posteDerArcoInf
					 * .getX()) && posPortero.getX() >
					 * Constantes.posteIzqArcoInf .getX()){ comandos.add(new
					 * ComandoIrA(0, posPortero));
					 * System.out.println("0:"+posPortero.getX()); } else { if
					 * (sp.balon().getY() > 0) { posPortero = new Posicion( 0,
					 * (-(Constantes.LARGO_CAMPO_JUEGO / 2)) + 1);
					 * comandos.add(new ComandoIrA(0, posPortero));
					 * System.out.println("1:"+posPortero.getX()); } }
					 */

				} else if (((Grid.GRIDY * i0) + j0 == 31)
						|| ((Grid.GRIDY * i0) + j0 == 32)) {// Si defensa

					boolean trobat = false;
					int[] posicion_balon = grid.position(sp);
					for (int iau2x = 0; iau2x < posicion_balon.length; iau2x++) {
						if (posicion_balon[iau2x] == ((Grid.GRIDY * i0) + j0))
							trobat = true;
					}

					if (trobat) {
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								sp.balon()));
					} else {
						GridPosition gp = grid.getGridPosition(i0, j0);
						Posicion tmp = new Posicion(
								((gp.getX1() + gp.getX2()) / 2),
								((gp.getY1() + gp.getY2()) / 2));
						comandos.add(new ComandoIrA(((Grid.GRIDY * i0) + j0),
								tmp));
					}

					// sale el balon
					/*
					 * if ((sp.balon().getX() < Constantes.ANCHO_CAMPO_JUEGO /
					 * 2) || (sp.balon().getY() < Constantes.LARGO_CAMPO_JUEGO /
					 * 2)) { if (sp.balon().getX() > 0) comandos.add(new
					 * ComandoIrA(2, sp.balon())); else comandos.add(new
					 * ComandoIrA(1, sp.balon())); }
					 */

				} else { // if ((Grid.GRIDY * i0) + j0 == 30) {// Si no es
					// portero, ni defensas, ni delantero
					// int[] posicion_balon = grid.position(sp);
					// int indMasCercano =
					// sp.balon().indiceMasCercano(sp.misJugadores());
					// sp.misJugadores()[indMasCercano]

					if ((((Grid.GRIDY * i0) + j0) > 0)
							&& ((Grid.GRIDY * i0) + j0) < 11) {
						// for (int iaux = 0; iaux < posicion_balon.length;
						// iaux++) {

						// boolean trobat = false;
						// for (int iau2x = 0; iau2x < posicion_balon.length;
						// iau2x++) {
						// if (posicion_balon[iau2x] == ((Grid.GRIDY * i0) +
						// j0))
						// trobat = true;
						// }

						// if (!trobat) {
						// Desmarque
						// sin
						// salir
						// de mi
						// Grid
						GridPosition gp = grid.getGridPosition(i0, j0);

						// if (((Grid.GRIDY * i0) + j0 == 6)
						// || (Grid.GRIDY * i0) + j0 == 7) {
						// System.out.println("jug:"+((Grid.GRIDY * i0) + j0)
						// +":x1:"
						// +gp.getX1()+"y1:"+gp.getY1()+":x2:"+gp.getX2()+
						// "y2:"+gp.getY2());
						// }
						// mejor posicion dentro de mi grid
						// System.out.println("mijugador:"
						// + ((Grid.GRIDY * i0) +
						// j0)+"gp.X1"+gp.getX1()+
						// "gp.Y1"+gp.getY1()+"gp.X2"
						// +gp.getX2()+"gp.Y2"+gp.getY2());
						// System.out.println("sp.misJugadores()[1] X:"
						// + sp.misJugadores()[1].getX() + "Y:"
						// + sp.misJugadores()[1].getY());

						// System.out.println("((Grid.GRIDY * i0) + j0)"+((Grid.
						// GRIDY * i0) + j0));

						Posicion mejorPos = mejorPosicionDentrodeMiGrid(sp
								.misJugadores()[((Grid.GRIDY * i0) + j0)], sp
								.balon(), gp, sp.rivales(),
								((Grid.GRIDY * i0) + j0));

						// System.out.println("break");
						// }
						int[] posicion_balon = grid.position(sp);

						boolean trobat = false;
						boolean trobat2 = false;
						Posicion mejorPos2 = null;
						for (int iau2x = 0; iau2x < posicion_balon.length; iau2x++) {
							if (posicion_balon[iau2x] == ((Grid.GRIDY * i0) + j0))
								trobat = true;
						}

						// si estoy m�s cerca que los rivales trobat = true
						int indMasCercano = sp.balon().indiceMasCercano(
								sp.misJugadores());

						int indMasCercanoRivales = sp.balon().indiceMasCercano(
								sp.rivales());

						Posicion posicionMia = new Posicion(
								sp.misJugadores()[indMasCercano].getX(), sp
										.misJugadores()[indMasCercano].getY());
						Posicion posicionRival = new Posicion(
								sp.rivales()[indMasCercanoRivales].getX(), sp
										.rivales()[indMasCercanoRivales].getY());

						Posicion posicionComparar[] = new Posicion[2];
						posicionComparar[0] = posicionMia;
						posicionComparar[1] = posicionRival;

						if ((sp.balon().indiceMasCercano(posicionComparar) == 1)
								&& (indMasCercano == ((Grid.GRIDY * i0) + j0))) {
							trobat = true;
						}

						/*
						 * if ((((Grid.GRIDY i0) + j0) == 1) && (mejorPos !=
						 * null) && (!trobat)) {
						 * //System.out.println("balon X"+sp.balon().getX()+"Y"
						 * // +sp.balon().getY()); //
						 * System.out.println("mejorPos != null"+(mejorPos // !=
						 * null)+"(!trobat)"+(!trobat));
						 * 
						 * mejorPos = mejorPosicionDentrodeMiGrid(sp
						 * .misJugadores()[((Grid.GRIDY i0) + j0)], sp.balon(),
						 * gp, sp.rivales(), ((Grid.GRIDY i0) + j0)); }
						 */

						// con balon
						int rematan[] = sp.puedenRematar();

						// System.out.println("I:"+((Grid.GRIDY * i0) +
						// j0)+"trobat"+trobat);
						// recorre los jugadores que pueden rematar
						for (int i : rematan) {
							// System.out.println("i remata"+i);
							if (i == ((Grid.GRIDY * i0) + j0) && trobat)
								trobat2 = true;
						}

						int test = -1;

						if (trobat2) {// el balon esta en migrid y puedo
							// rematar, el resto de jugadores se desmarca
							for (int ix = 4; ix < 11; ix++) {
								if (ix != ((Grid.GRIDY * i0) + j0)) {
									mejorPos2 = mejorPosicionDentrodeMiGrid2(sp
											.misJugadores()[ix], gp, sp
											.rivales(), ix);
									comandos.add(new ComandoIrA(ix, mejorPos2));
								}
							}
						}

						if (mejorPos != null && (!trobat) && (!trobat2)) {
							comandos.add(new ComandoIrA(
									((Grid.GRIDY * i0) + j0), mejorPos));
							// test = 1;
						} else if (mejorPos2 != null && (trobat2)) {
							// if((((Grid.GRIDY * i0) + j0)==1)||((Grid.GRIDY *
							// i0) + j0)==2)
							// System.out.println("break");
							// comandos.add(new ComandoIrA(
							// ((Grid.GRIDY * i0) + j0), mejorPos2));
							// test=2;
						} else {

							// System.out.println("mejorPos != null"+(mejorPos
							// != null)+"(!trobat)"+(!trobat));
							// } else {// voy a por el bal�n que esta en mi grid
							comandos.add(new ComandoIrA(
									((Grid.GRIDY * i0) + j0), sp.balon()));
							// test = 3;
						}
						// if(((Grid.GRIDY * i0) + j0)==3)
						// System.out.println("test:"+test+":sp.x:"+sp.
						// misJugadores()[((Grid.GRIDY * i0) +
						// j0)].getX()+":sp.y:"+sp.misJugadores()[((Grid.GRIDY *
						// i0) + j0)].getY());
						// }
						// }
						// sale el balon
						/*
						 * if ((sp.balon().getX() > Constantes.ANCHO_CAMPO_JUEGO
						 * / 2) || (sp.balon().getY() >
						 * Constantes.LARGO_CAMPO_JUEGO / 2)) { if
						 * (sp.balon().getX() > 0) comandos.add(new
						 * ComandoIrA(10, sp.balon())); else comandos.add(new
						 * ComandoIrA(11, sp.balon())); }
						 */
						// comandos.add(new ComandoIrA(
						// ((Grid.GRIDY * i0) + j0), sp.balon()));
					}
				}
			}
		}

		// /
		// obtiene un arreglo con los indices de los jugadores que pueden
		// rematar
		int rematan[] = sp.puedenRematar();
		// recorre los jugadores que pueden rematar
		for (int i : rematan) {
			// obtiene los jugadores mas cercanos, al jugador que puede rematar
			int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp
					.misJugadores());
			// encontro un pase en falso
			boolean pase = false;
			boolean alto;
			boolean rival = false;
			// recorre los jugadores desde el mas lejano al mas cercano
			for (int j = 1; !pase && j < cercanos.length; j++) {
				// si el jugador es distinto al jugador que remata y el jugador
				// esta mas adelantado
				if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]]
						.getY()) {
					// dar pase al jugador mas cercano que este en posicion mas
					// ofensiva
					if (sp.misJugadores()[i]
							.distancia(sp.misJugadores()[cercanos[j]]) > 20) {
						alto = true;
					} else {
						alto = false;
					}

					Posicion[] cercanosRivales = sp.rivales();
					for (int irival = 0; irival < cercanosRivales.length; irival++) {
						// Ecuaci�n recta
						double y = (sp.misJugadores()[cercanos[j]].getY() - sp
								.misJugadores()[i].getY())
								/ (sp.misJugadores()[cercanos[j]].getX() - sp
										.misJugadores()[i].getX());
						if (cercanosRivales[irival].getY() == (y * cercanosRivales[irival]
								.getX())
								- (y * sp.misJugadores()[i].getX())
								+ sp.misJugadores()[i].getY())
							rival = true;

						if (sp.balon().getY() < -20) {
							double x1 = sp.misJugadores()[cercanos[j]].getX()
									- cercanosRivales[irival].getX();
							double y1 = sp.misJugadores()[cercanos[j]].getY()
									- cercanosRivales[irival].getX();

							if ((x1 > -3 && x1 < 3) || (y1 > -3 && y1 < 3)) // Si
								// esta
								// demasiado
								// cerca
								// el
								// rival
								rival = true;

						}
					}

					if (!rival) {// no hay oponente entre mi pase y el destino

						comandos.add(new ComandoGolpearBalon(i, sp
								.misJugadores()[cercanos[j]], .5 + rand
								.nextDouble() * .5, alto));
						// encontro un pase por lo menos
						pase = true;
					}

					/*
					 * comandos.add(new ComandoGolpearBalon(i, sp
					 * .misJugadores()[cercanos[j]], .5 + rand .nextDouble() .5,
					 * alto)); // encontro un pase por lo menos pase = true;
					 */
				}

				// if(rival)
				// System.out.println("break2");
			}

			// si no encontro ningun pase
			if (!pase) {

				// da pase hacia el jugador mas cercano
				if (sp.misJugadores()[i]
						.distancia(sp.misJugadores()[cercanos[1]]) > 20) {
					alto = true;
				} else {
					alto = false;
				}

				if (sp.balon().getY() < -40) {
					comandos.add(new ComandoGolpearBalon(i,
							sp.misJugadores()[cercanos[cercanos.length - 1]],
							1, true));
				} else {
					// XXX quitar rand, calcularlo ?
					comandos.add(new ComandoGolpearBalon(i,
							sp.misJugadores()[cercanos[1]], .5 + rand
									.nextDouble() * .5, alto));
				}

			}

			if ((!pase) && (rival)) {

			}

			// si el jugador que remata esta a menos de 30 metros del arco rival
			// -> remata al arco

			if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 30) {

				// XXX AMPLIAR PARA PORTERO Y DEMAS
				double distmax = 0;
				double xportero = sp.rivales()[0].getX();
				for (int pos_porteria = (int) Constantes.centroArcoSup.getX() - 2; pos_porteria < Constantes.centroArcoSup
						.getX() + 2; pos_porteria++) {
					int posi = pos_porteria - (int) xportero;
					if (posi < 0) {
						if ((-posi) > -distmax)
							distmax = pos_porteria;
					} else {
						if (((posi) > distmax) && ((posi) > -distmax))
							distmax = pos_porteria;
					}
				}
				// System.out.println("distmax"+distmax);
				comandos.add(new ComandoGolpearBalon(i, new Posicion(distmax,
						Constantes.LARGO_CAMPO_JUEGO / 2), 1, false));
			}

		}
		// /

		// comandos.add(new ComandoGolpearBalon(i,
		// sp.misJugadores()[cercanos[j]], .5 + rand
		// .nextDouble() * .5, alto));

		// int posicion_balon = grid.position(sp);
		// int indMasCercano = sp.balon().indiceMasCercano(sp.misJugadores());
		// comandos.add(new ComandoIrA(indMasCercano, sp.balon()));

		// System.exit(-1);
		// }

		// retorna la lista de comandos.
		return comandos;
	}

	Posicion mejorPosicionDentrodeMiGrid2(Posicion posjugador, GridPosition gp,
			Posicion[] rivales, int jugador) {
		Posicion tmp = null;

		double ancho_grid = gp.getX2() - gp.getX1();
		double largo_grid = gp.getY2() - gp.getY1();
		;

		if (ancho_grid < 0)
			ancho_grid = ancho_grid * -1;
		if (largo_grid < 0)
			largo_grid = largo_grid * -1;

		int[] tmpposi = new int[4];
		// System.out.println("x1:" + gp.getX1() + "y1:" + gp.getY1() + "x2:"
		// + gp.getX2() + "y2:" + gp.getY2());

		if (jugador > 0 && jugador < 11) {

			for (int i = 0; i < rivales.length; i++) {
				// System.out.println("rival X:" + rivales[i].getX() + "Y:"
				// + rivales[i].getY());
				if ((gp.getX1() <= rivales[i].getX()) // Z1 primer cuadrante
						&& (gp.getY1() <= rivales[i].getY())
						&& ((gp.getX1() + (ancho_grid / 2)) >= rivales[i]
								.getX())
						&& ((gp.getY1() + (largo_grid / 2)) >= rivales[i]
								.getY())) {
					tmpposi[0] = tmpposi[0] + 1;

				} else if ((gp.getX1() + (ancho_grid / 2) < rivales[i].getX())// Z2
						// segundo
						// cuadrante
						&& (gp.getY1() < rivales[i].getY())
						&& (gp.getX2() > rivales[i].getX())
						&& ((gp.getY1() + (largo_grid / 2)) > rivales[i].getY())) {
					tmpposi[1] = tmpposi[1] + 1;
				} else if (((gp.getX1() < rivales[i].getX()))// Z3
						// tercer
						// cuadrante
						&& (gp.getY1() + (largo_grid / 2) < rivales[i].getY())
						&& (gp.getX1() + (ancho_grid / 2) > rivales[i].getX())
						&& (gp.getY2() > rivales[i].getY())) {
					tmpposi[2] = tmpposi[2] + 1;
				} else if ((((gp.getX1() + (ancho_grid / 2)) < rivales[i]
						.getX())// Z4 cuarto
						// cuadrante
						&& ((gp.getY1() + (largo_grid / 2)) < rivales[i].getY())
						&& (gp.getX2() > rivales[i].getX()) && (gp.getY2() > rivales[i]
						.getY()))) {
					tmpposi[3] = tmpposi[3] + 1;
				}
			}

			int auxi = 10;
			int minim = -1;
			int total = 0;
			for (int i = 0; i < 4; i++) {// Calcula el minimo (donde hay menos
				// rivales
				if (tmpposi[i] < auxi) {
					auxi = tmpposi[i];
					total = total + tmpposi[i];
					minim = i;
				}
			}
			if (minim == 0) {// Z1
				tmp = new Posicion(gp.getX1(), gp.getY1());
			} else if (minim == 1) {// Z2
				tmp = new Posicion(gp.getX2(), gp.getY1());
			} else if (minim == 2) {// Z3
				tmp = new Posicion(gp.getX1(), gp.getY2());
			} else {// Z4
				tmp = new Posicion(gp.getX2(), gp.getY2());
			}

			// ir hacia la direcci�n donde hay menos jugadores rivales
		} else {
			tmp = null;
		}

		return tmp;
	}

	Posicion mejorPosicionDentrodeMiGrid(Posicion posjugador, Posicion balon,
			GridPosition gp, Posicion[] rivales, int jugador) {
		Posicion tmp = null;

		double[][] cuadrante = new double[4][2];
		int min = -1;
		int max = -1;
		double ancho_grid = gp.getX2() - gp.getX1();
		double largo_grid = gp.getY2() - gp.getY1();

		if (ancho_grid < 0)
			ancho_grid = ancho_grid * -1;
		if (largo_grid < 0)
			largo_grid = largo_grid * -1;

		// if(ancho_grid<0) ancho_grid = ancho_grid*-1;
		// if(largo_grid<0) largo_grid = largo_grid*-1;

		// en funci�n del bal�n
		if (((gp.getX1() + gp.getX2()) / 2) < balon.getX())
			tmp = new Posicion(((gp.getX1() + gp.getX2()) / 2)
					+ (ancho_grid / 2), ((gp.getY1() + gp.getY2()) / 2));
		else
			tmp = new Posicion(((gp.getX1() + gp.getX2()) / 2)
					- (ancho_grid / 2), ((gp.getY1() + gp.getY2()) / 2));

		for (int iaux = 0; iaux < 4; iaux++) {
			cuadrante[iaux][1] = (Constantes.LARGO_CAMPO_JUEGO);
		}
		// if(jugador==6||jugador==7){
		// System.out.println("jug");
		// }
		int one = 0, two = 0, three = 0, four = 0;
		// System.out.println("x1:" + gp.getX1() + "y1:" + gp.getY1() + "x2:"
		// + gp.getX2() + "y2:" + gp.getY2());

		for (int i = 0; i < rivales.length; i++) {
			// System.out.println("rival X:" + rivales[i].getX() + "Y:"
			// + rivales[i].getY());
			if ((gp.getX1() <= rivales[i].getX()) // Z1 primer cuadrante
					&& (gp.getY1() <= rivales[i].getY())
					&& ((gp.getX1() + (ancho_grid / 2)) >= rivales[i].getX())
					&& ((gp.getY1() + (largo_grid / 2)) >= rivales[i].getY())) {
				one = 1;
				if (cuadrante[0][1] > rivales[i].getY()) {

					cuadrante[0][0] = rivales[i].getX();
					cuadrante[0][1] = rivales[i].getY();
				}
			} else if ((gp.getX1() + (ancho_grid / 2) < rivales[i].getX())// Z2
					// segundo
					// cuadrante
					&& (gp.getY1() < rivales[i].getY())
					&& (gp.getX2() > rivales[i].getX())
					&& ((gp.getY1() + (largo_grid / 2)) > rivales[i].getY())) {
				two = 1;
				if (cuadrante[1][1] > rivales[i].getY()) {

					cuadrante[1][0] = rivales[i].getX();
					cuadrante[1][1] = rivales[i].getY();
				}
			} else if (((gp.getX1() < rivales[i].getX()))// Z3
					// tercer
					// cuadrante
					&& (gp.getY1() + (largo_grid / 2) < rivales[i].getY())
					&& (gp.getX1() + (ancho_grid / 2) > rivales[i].getX())
					&& (gp.getY2() > rivales[i].getY())) {
				three = 1;
				if (cuadrante[2][1] > rivales[i].getY()) {

					cuadrante[2][0] = rivales[i].getX();
					cuadrante[2][1] = rivales[i].getY();
				}
			} else if ((((gp.getX1() + (ancho_grid / 2)) < rivales[i].getX())// Z4
					// cuarto
					// cuadrante
					&& ((gp.getY1() + (largo_grid / 2)) < rivales[i].getY())
					&& (gp.getX2() > rivales[i].getX()) && (gp.getY2() > rivales[i]
					.getY()))) {
				four = 1;
				if (cuadrante[3][1] > rivales[i].getY()) {

					cuadrante[3][0] = rivales[i].getX();
					cuadrante[3][1] = rivales[i].getY();
				}
			}
		}

		// System.out.println("one" + one + "two" + two + "three" + three +
		// "four"
		// + four);

		/*
		 * if (one == 1) tmp = new Posicion(gp.getX2(), gp.getY2()); else if
		 * (two == 1) tmp = new Posicion(gp.getX2(), gp.getY1()); else if (three
		 * == 1) tmp = new Posicion(gp.getX1(), gp.getY2()); else if (four == 1)
		 * tmp = new Posicion(gp.getX1(), gp.getY1()); else if (one == 1 && two
		 * == 1) tmp = new Posicion(gp.getX2(), gp.getY1() + (-gp.getY1() / 2));
		 * else if ((two == 1 && three == 1) || (one == 1 && four == 1)) tmp =
		 * new Posicion(gp.getX1() + (-gp.getX1() / 2), gp.getY1() +
		 * (-gp.getY1() / 2)); else if (three == 1 && four == 1) tmp = new
		 * Posicion(gp.getX1(), gp.getY1() + (-gp.getY1() / 2)); else if (one ==
		 * 1 && three == 1) tmp = new Posicion(gp.getX2(), gp.getY1() +
		 * (-gp.getY1() / 2)); else if (two == 1 && four == 1) tmp = new
		 * Posicion(gp.getX1(), gp.getY1() + (-gp.getY1() / 2)); else if ((one
		 * == 1 && two == 1 && three == 1 && four == 1) || (one == 0 && two == 0
		 * && three == 0 && four == 0))
		 */

		double auxiliar_min = Constantes.LARGO_CAMPO_JUEGO + 1;
		double auxiliar_max = (Constantes.LARGO_CAMPO_JUEGO + 1) * -1;
		if (jugador > 0 && jugador < 9) {

			for (int i2 = 0; i2 < 4; i2++) {

				if (auxiliar_min >= cuadrante[i2][1]) {

					if ((one == 1 && i2 == 0) || (two == 1 && i2 == 1)
							|| (three == 1 && i2 == 2)
							|| (four == 1 && i2 == 3)) {
						auxiliar_min = cuadrante[i2][1];
						min = i2;
					}
				}
				if (auxiliar_max <= cuadrante[i2][1]) {
					if ((one == 1 && i2 == 0) || (two == 1 && i2 == 1)
							|| (three == 1 && i2 == 2)
							|| (four == 1 && i2 == 3)) {
						auxiliar_max = cuadrante[i2][1];
						max = i2;
					}
				}

			}
			// if((one==1||two==1)&&(one==1||three==1)&&(one==1||four==1))
			// System.out.println("break");

			int desplaza;
			if (balon.getX() > posjugador.getX())
				desplaza = 2;
			else
				desplaza = -2;

			if (balon.getY() > posjugador.getY()) {
				if (min != -1)
					tmp = new Posicion(cuadrante[min][0] + desplaza,
							cuadrante[min][1] + 8);
				// if ((one==0)&&(two==0)&&(three==0)&&(four==0))
				// tmp2 = new Posicion(((gp.getX1() + gp.getX2()) / 2), ((gp
				// .getY1() + gp.getY2()) / 2));
			} else {
				if (min != -1)
					tmp = new Posicion(cuadrante[min][0] + desplaza,
							cuadrante[min][1] - 8);
				// if ((one==0)&&(two==0)&&(three==0)&&(four==0))
				// tmp2 = new Posicion(((gp.getX1() + gp.getX2()) / 2), ((gp
				// .getY1() + gp.getY2()) / 2));
			}

			/*
			 * if ((one == 1) || (two == 1)&&(balon.getY()>posjugador.getY())) {
			 * tmp = new Posicion(cuadrante[0][0], cuadrante[0][1] + 15); }else
			 * if ((one == 1) || (two == 1)&&(balon.getY()<posjugador.getY())) {
			 * tmp = new Posicion(cuadrante[0][0], cuadrante[0][1] -15); }else
			 * if ((three == 1) || (four == 1) &&
			 * (balon.getY()>posjugador.getY())) { tmp = new
			 * Posicion(cuadrante[2][0], cuadrante[2][1] + 15); }else if ((three
			 * == 1) || (four == 1)&&(balon.getY()<posjugador.getY())) { tmp =
			 * new Posicion(cuadrante[2][0], cuadrante[2][1] - 15); } else {
			 * 
			 * tmp = new Posicion(((gp.getX1() + gp.getX2()) / 2), ((gp .getY1()
			 * + gp.getY2()) / 2)); }
			 */
			// } else {
			// tmp2 = new Posicion(((gp.getX1() + gp.getX2()) / 2),
			// ((gp.getY1() + gp.getY2()) / 2));
		}

		return tmp;
	}

	public List<Comando> ejecutar1(SituacionPartido sp) {
		// vacia la lista de comandos
		comandos.clear();
		// si voy perdiendo o empatando
		if (sp.golesPropios() <= sp.golesRival()) {
			// cada jugador ubicarse segun alineacion1
			for (int i = 0; i < 11; i++) {
				comandos.add(new ComandoIrA(i, alineacion1[i]));
			}
		} else {// sino, osea que voy ganando
			// cada jugador ubicarse segun alineacion2
			for (int i = 0; i < 11; i++) {
				comandos.add(new ComandoIrA(i, alineacion2[i]));
			}
		}
		// obtiene el indice del jugador mas cercano al balon

		int indMasCercano = sp.balon().indiceMasCercano(sp.misJugadores());

		int indMasCercanoRivales = sp.balon().indiceMasCercano(sp.rivales());

		Posicion posicionMia = new Posicion(sp.misJugadores()[indMasCercano]
				.getX(), sp.misJugadores()[indMasCercano].getY());
		Posicion posicionRival = new Posicion(
				sp.rivales()[indMasCercanoRivales].getX(),
				sp.rivales()[indMasCercanoRivales].getY());

		Posicion posicionComparar[] = new Posicion[2];
		posicionComparar[0] = posicionMia;
		posicionComparar[1] = posicionRival;

		// si es m�s rapido y esta m�s cerca seguro que llega al balon antes
		/*
		 * if((sp.balon().indiceMasCercano(posicionComparar)==1)&&(sp.
		 * detalleJugadoresRivales()[indMasCercanoRivales].getVelocidad()>
		 * sp.detalleMisJugadores()[indMasCercano].getVelocidad())){
		 * comandos.add(new ComandoIrA(indMasCercano, posicionRival)); //si
		 * estoy m�s cerca y soy m�s r�pido } else if
		 * ((sp.balon().indiceMasCercano
		 * (posicionComparar)==0)&&(sp.detalleJugadoresRivales
		 * ()[indMasCercanoRivales].getVelocidad()<
		 * sp.detalleMisJugadores()[indMasCercano].getVelocidad())){ //el
		 * jugador mas cercano sigue al balon comandos.add(new
		 * ComandoIrA(indMasCercano, sp.balon())); }
		 */

		// si es m�s rapido y esta m�s cerca seguro que llega al balon antes
		if ((sp.balon().indiceMasCercano(posicionComparar) == 1)
				&& (sp.detalleJugadoresRivales()[indMasCercanoRivales]
						.getVelocidad() > sp.detalleMisJugadores()[indMasCercano]
						.getVelocidad())) {
			comandos.add(new ComandoIrA(indMasCercano, posicionRival));
			// si estoy m�s cerca y soy m�s r�pido
		} else {
			// el jugador mas cercano sigue al balon
			comandos.add(new ComandoIrA(indMasCercano, sp.balon()));
		}

		// cobertura defensas

		// no pasan de mediocamp

		double mitad_campo = Constantes.LARGO_CAMPO_JUEGO / (double) 2;

		// si valon esta en su campo
		/*
		 * if ((sp.balon().getY() > 0) && (sp.balon().getY() < mitad_campo)) {
		 * for (int j = 1; j < 6; j++) {
		 * System.out.println("sp.misJugadores()[j].getX()" +
		 * sp.misJugadores()[j].getY()); System.out.println("sp.balon().getY()"
		 * + sp.balon().getY());
		 * 
		 * if ((sp.misJugadores()[j].getY() < 0) && (sp.misJugadores()[j].getY()
		 * > -mitad_campo)) comandos.add(new ComandoIrA(j, sp.balon())); } }
		 * else { // si valon esta en mi campo, los defensas cooperan
		 * 
		 * // comandos.add(new ComandoIrA(j, alineacion2[j]));
		 * 
		 * }
		 */
		// System.out.print("(sp.balon().getY() > -(mitad_campo / 2))"
		// + (sp.balon().getY() > -(mitad_campo / 2)) + ":"
		// + -(mitad_campo / 2));
		// System.out.println("(sp.balon().getY() < 0)"
		// + (sp.balon().getY() < -mitad_campo) + ":" + -mitad_campo);
		// System.out.println("sp.balon().getY()" + sp.balon().getY() + ":");
		if ((sp.balon().getY() < -(mitad_campo / 2))
				&& (sp.balon().getY() > -mitad_campo)) {
			// System.out.print("(sp.balon().getY() > -(mitad_campo / 2))"
			// + (sp.balon().getY() > -(mitad_campo / 2)));
			// System.out.println("(sp.balon().getY() < 0)"
			// + (sp.balon().getY() < 0));

			// entre el balon y el compa�ero m�s cercano
			// int[] indices = posicionRival.indicesMasCercanos(sp.rivales(),
			// indMasCercanoRivales);
			// for (int i = 0; i < indices.length; i++) {
			comandos.add(new ComandoIrA(2, posicionRival.media(posicionRival,
					sp.misJugadores()[0])));
			// }
		} else {
			comandos.add(new ComandoIrA(2, alineacion2[2]));
		}

		// cobertura medios

		// obtiene un arreglo con los indices de los jugadores que pueden
		// rematar
		int rematan[] = sp.puedenRematar();
		// recorre los jugadores que pueden rematar
		for (int i : rematan) {
			// obtiene los jugadores mas cercanos, al jugador que puede rematar
			int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp
					.misJugadores());
			// encontro un pase en falso
			boolean pase = false;
			boolean alto;
			// recorre los jugadores desde el mas lejano al mas cercano
			for (int j = 1; !pase && j < cercanos.length; j++) {
				// si el jugador es distinto al jugador que remata y el jugador
				// esta mas adelantado
				if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]]
						.getY()) {
					// dar pase al jugador mas cercano que este en posicion mas
					// ofensiva
					if (sp.misJugadores()[i]
							.distancia(sp.misJugadores()[cercanos[j]]) > 20) {
						alto = true;
					} else {
						alto = false;
					}
					if (i == 0) {
						// comandos.add(new ComandoGolpearBalon(i,
						// new Posicion(0,0), 1, alto));

					} else
						comandos.add(new ComandoGolpearBalon(i, sp
								.misJugadores()[cercanos[j]], .5 + rand
								.nextDouble() * .5, alto));
					// encontro un pase por lo menos
					pase = true;
				}
			}
			// si no encontro ningun pase
			if (!pase) {
				// da pase hacia el jugador mas cercano
				if (sp.misJugadores()[i]
						.distancia(sp.misJugadores()[cercanos[1]]) > 20) {
					alto = true;
				} else {
					alto = false;
				}
				if (i == 0) {
					// comandos.add(new ComandoGolpearBalon(i,
					// new Posicion(0,0), 1, alto));

				} else {
					// xxx: quitar rand, calcularlo xxx
					comandos.add(new ComandoGolpearBalon(i,
							sp.misJugadores()[cercanos[1]], .5 + rand
									.nextDouble() * .5, alto));
				}
			}
			// si el jugador que remata esta a menos de 30 metros del arco rival
			// -> remata al arco
			if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 30) {
				comandos.add(new ComandoGolpearBalon(i,
						Constantes.centroArcoSup, 1, true));
			}
		}
		// retorna la lista de comandos.
		return comandos;
	}
}
